package role

import (
	"strconv"
	"x-admin/backend/pkg/response"

	"github.com/gin-gonic/gin"
)

// Handler 角色处理器
type Handler struct {
	service Service
}

// NewHandler 创建角色处理器
func NewHandler(service Service) *Handler {
	return &Handler{
		service: service,
	}
}

// Create 创建角色
// @Summary 创建角色
// @Description 创建新的角色
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param role body CreateRequest true "角色信息"
// @Success 200 {object} response.Response{data=RoleWithPermissions} "创建成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /roles [post]
func (h *Handler) Create(c *gin.Context) {
	var req CreateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	role, err := h.service.Create(&req)
	if err != nil {
		if err.Error() == "角色名已存在" {
			response.BadRequest(c, err.Error())
			return
		}
		response.InternalServerError(c, "创建角色失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "创建角色成功", role)
}

// GetByID 根据ID获取角色
// @Summary 获取角色详情
// @Description 根据ID获取角色详细信息
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param id path int true "角色ID"
// @Success 200 {object} response.Response{data=RoleWithPermissions} "获取成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "角色不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /roles/{id} [get]
func (h *Handler) GetByID(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的角色ID")
		return
	}

	role, err := h.service.GetByID(uint(id))
	if err != nil {
		if err.Error() == "角色不存在" {
			response.NotFound(c, err.Error())
			return
		}
		response.InternalServerError(c, "获取角色失败: "+err.Error())
		return
	}

	response.Success(c, role)
}

// Update 更新角色
// @Summary 更新角色
// @Description 根据ID更新角色信息
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param id path int true "角色ID"
// @Param role body UpdateRequest true "角色信息"
// @Success 200 {object} response.Response{data=RoleWithPermissions} "更新成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "角色不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /roles/{id} [put]
func (h *Handler) Update(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的角色ID")
		return
	}

	var req UpdateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	role, err := h.service.Update(uint(id), &req)
	if err != nil {
		if err.Error() == "角色不存在" {
			response.NotFound(c, err.Error())
			return
		}
		if err.Error() == "角色名已存在" {
			response.BadRequest(c, err.Error())
			return
		}
		response.InternalServerError(c, "更新角色失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "更新角色成功", role)
}

// Delete 删除角色
// @Summary 删除角色
// @Description 根据ID删除角色
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param id path int true "角色ID"
// @Success 200 {object} response.Response "删除成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "角色不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /roles/{id} [delete]
func (h *Handler) Delete(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的角色ID")
		return
	}

	if err := h.service.Delete(uint(id)); err != nil {
		if err.Error() == "角色不存在" {
			response.NotFound(c, err.Error())
			return
		}
		response.InternalServerError(c, "删除角色失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "删除角色成功", nil)
}

// List 获取角色列表
// @Summary 获取角色列表
// @Description 分页获取角色列表
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param page query int false "页码" default(1)
// @Param page_size query int false "每页数量" default(10)
// @Param keyword query string false "关键词搜索"
// @Param name query string false "角色名称"
// @Param display_name query string false "显示名称"
// @Param status query int false "状态"
// @Success 200 {object} response.PageResponse{data=[]RoleWithPermissions} "获取成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /roles [get]
func (h *Handler) List(c *gin.Context) {
	var req QueryRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	roles, total, err := h.service.List(&req)
	if err != nil {
		response.InternalServerError(c, "获取角色列表失败: "+err.Error())
		return
	}

	response.Page(c, roles, total, req.Page, req.PageSize)
}

// AssignPermissions 分配权限
// @Summary 分配角色权限
// @Description 为角色分配权限
// @Tags 角色管理
// @Accept json
// @Produce json
// @Param id path int true "角色ID"
// @Param permissions body AssignPermissionsRequest true "权限列表"
// @Success 200 {object} response.Response{data=RoleWithPermissions} "分配成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "角色不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /roles/{id}/permissions [post]
func (h *Handler) AssignPermissions(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的角色ID")
		return
	}

	var req AssignPermissionsRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	role, err := h.service.AssignPermissions(uint(id), &req)
	if err != nil {
		if err.Error() == "角色不存在" {
			response.NotFound(c, err.Error())
			return
		}
		response.InternalServerError(c, "权限分配失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "权限分配成功", role)
}

// GetAllRoles 获取所有角色
// @Summary 获取所有角色
// @Description 获取所有启用的角色（用于下拉选择）
// @Tags 角色管理
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=[]Role} "获取成功"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /roles/all [get]
func (h *Handler) GetAllRoles(c *gin.Context) {
	roles, err := h.service.GetAllRoles()
	if err != nil {
		response.InternalServerError(c, "获取角色列表失败: "+err.Error())
		return
	}

	response.Success(c, roles)
}
